package controllers;
import api.v1.CSVFile;
import api.v1.InvoiceData;
import auth.modules.TokenAuthorize;
import auth.types.PermissionType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import compositions.*;
import exceptions.PoseidonException;
import models.InvoiceLine;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import play.libs.Json;
import play.mvc.Http;
import play.mvc.Result;
import service.*;
import java.io.*;
import java.util.*;
@ResponseTimeLoggingComposition.ResponseTimeLogging
@NoCacheComposition.NoCache
@ErrorHandlingComposition.ErrorHandling
@RequestLoggingComposition.RequestLogging
@CorsComposition.Cors
public class InvoiceGeneratorControllerV1 extends PoseidonController {
public static final String CSV_DIR = "csvfile.invoice.dir";
public static final String CSV_URL = "/csv/invoice/";
@TokenAuthorize(requiredPermission = PermissionType.INVOICING)
public Result generateInvoice(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
InvoiceData data ;
try {
data = mapper.readValue(body.toString(), InvoiceData.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
InvoiceGeneratorService invoiceGeneratorService = new InvoiceGeneratorService(currentApiUser().username);
String phone = PoseidonPropertyService.getProperty("invoicing.phonenr");
String ourReference = currentApiUser().name + "/" + phone;
if ( data == null || data.forecasts == null || data.forecasts.length == 0){
return badRequest("Ingen varslinger valgt for fakturering");
}
List<InvoiceLine> invoiceData = invoiceGeneratorService.generateInvoiceLines(data,ourReference);
if ( invoiceData == null||invoiceData.size() ==0) {
throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR,"Valgte varslinger genererte ingen fakturalinjer");
}
String csv = invoiceGeneratorService.generateInvoice(invoiceData);
String filename = writeCSVFileToDisk(data, csv);
invoiceGeneratorService.markForecastsAsBilled(data.forecasts);
CSVFile csvFile = new CSVFile(CSV_URL + filename,filename);
return ok(Json.toJson(csvFile));
}
@TokenAuthorize(requiredPermission = PermissionType.INVOICING)
public Result listGeneratedFiles() {
CSVDownloadService service = new CSVDownloadService();
List<CSVFile> csvFiles = service.getCsvFiles(CSV_DIR,CSV_URL);
return ok(Json.toJson(csvFiles));
}
private String writeCSVFileToDisk(InvoiceData data, String csv) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd_HH:mm_ZZZ");
data.filename = (data.filename!=null?data.filename + "-" :"").replace(" ","_");
DateTime now = PoseidonService.getNow();
String filename =data.filename + formatter.print(now) + ".csv";
String csvdir = PoseidonPropertyService.getProperty(CSV_DIR);
csvdir = csvdir.endsWith("/")?csvdir:csvdir + "/";
new CsvWriter().writeCsvToFile(csv,filename,csvdir);
return filename;
}
}